#################################这里是通用的Makefile#############################################################


CROSS_COMPILE ?= arm-linux-gnueabihf-
TARGET		  ?= bsp

#上面的 ?= 表示当前面CROSS_COMPILE被赋值后就不再给他赋值了,但是当他没有被赋值时,就给它赋值

CC		    := $(CROSS_COMPILE)gcc#CC就相当于 		arm-linux-gnueabihf-gcc
LD			:= $(CROSS_COMPILE)ld#LD相当于   		arm-linux-gnueabihf-ld
OBJCOPY		:= $(CROSS_COMPILE)objcopy#OBJCOPY相当于		arm-linux-gnueabihf-objcopy
OBJDUMP 	:= $(CROSS_COMPILE)objdump#OBJDUMP相当于      arm-linux-gnueabihf-objdump

INCDIRS		:= imx6ul\
		  	bsp/clk\
		   	bsp/led\
		   	bsp/delay
#上面的相当于  INCDIRS := imx6ul bsp/clk bsp/led bsp/delay

SRCDIRS 	:= project\
		    bsp/clk\
		    bsp/led\
		    bsp/delay
#上面的相当于  SRCDIRS := project bsp/clk bsp/led bsp/delay

INCLUDE 	:= $(patsubst %, -I %,$(INCDIRS))
#上面相当于	   INCLUDE := -I imx6ul -I bsp/clk -I bsp/led -I bsp/delay

SFILES  	:= $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.S))
#上面相当于    SFILES  := project/start.S

CFILES  	:= $(foreach dir,$(SRCDIRS),$(wildcard $(dir)/*.c))
#上面相当于	   CFILES  := project/main.c bsp/clk/bsp_clk.c bsp/led/bsp_led.c bsp/delay/bsp_delay.c

SFILENDIR 	:= $(notdir $(SFILES))
#上面相当于 SFILENDIR := start.S

CFILENDIR   := $(notdir $(CFILES))
#上面相当于 CFILENDIR := main.c bsp_clk.c bsp_led.c bsp_delay.c

SOBJS		:= $(patsubst %, obj/%, $(SFILENDIR:.S=.o))    #这里的$(SFILENDIR:.S=.o) 表示将SFILENDIR中的.S文件后缀改为.O
#上面相当于 SOBJS := obj/start.o   难道是他进行的搬运
 
COBJS		:= $(patsubst %, obj/%, $(CFILENDIR:.c=.o))    #这里的$(SFILENDIR:.S=.o) 表示将SFILENDIR中的.c文件后缀改为.O
#上面相当于 COBJS := obj/main.o bsp_clk.o bsp_led.o bsp_delay.o

#上面的变量SOBJS和COBJS是.S和.c文件编译后对应的.o文件目录

OBJS		:= $(SOBJS) $(COBJS)   
#上面就相当于  OBJS := obj/start.o obj/main.o bsp_clk.o bsp_led.o bsp_delay.o

VPATH		:= $(SRCDIRS)
#上面是指定搜索目录  当编译的时候所需要的.S和.c文件就会在SRCDIRS中指定的目录中查找

.PHONY : clean

$(TARGET).bin : $(OBJS)
	$(LD) -Timx6ul.lds -o $(TARGET).elf $^
	$(OBJCOPY) -O binary -S $(TARGET).elf $@
	$(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis

$(SOBJS) : obj/%.o : %.S    #这里是大写的S
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

$(COBJS) : obj/%.o : %.c
	$(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $<

clean:
	rm -rf $(TARGET).elf	$(TARGET).dis	$(TARGET).bin	$(COBJS)	$(SOBJS)
  
#上面的一些规则其实我还不太懂  
